package com.winning.pmph.ctrl;

import com.alibaba.fastjson.JSONObject;
import com.winning.pmph.utils.ApplicationContextUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.*;

@Api(value = "富文本上传图片接口")
@RestController
@RequestMapping("/pmph/action/richEditor")
public class RichEditorImgUploadCtrl {

    @ApiOperation(value = "richEditorImgUpload", notes = "富文本上传图片接口")
    @PostMapping("richEditorImgUpload")
    public void richEditorImgUpload(HttpServletResponse response, HttpServletRequest request) throws IOException {
        // 文件保存目录路径
        String savePath = ApplicationContextUtil.BASE_DOWN_FORDER + "image/";
        // 文件保存目录URL
        String saveUrl = "/ymer/action/file/showImage?filename=image/";

        // 定义允许上传的文件扩展名
        HashMap<String, String> extMap = new HashMap<String, String>();
        extMap.put("image", "gif,jpg,jpeg,png,bmp");
        extMap.put("flash", "swf,flv");
        extMap.put("media", "swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb");
        extMap.put("file", "doc,docx,xls,xlsx,ppt,txt,zip,rar,gz,bz2");

        // 最大文件大小
        long maxSize = 100000000;

        response.setContentType("text/html; charset=UTF-8");

        PrintWriter out = response.getWriter();

        if (!ServletFileUpload.isMultipartContent(request)) {
            out.print("请选择文件。");
            return;
        }
        // 检查目录
        File uploadDir = new File(savePath);
        if (!uploadDir.isDirectory()) {
            out.print("上传目录不存在。");
            return;
        }
        // 检查目录写权限
        if (!uploadDir.canWrite()) {
            out.print("上传目录没有写权限。");
            return;
        }
        String dirName = request.getParameter("dir");
        File dirFile = new File(savePath);
        if (!dirFile.exists()) {
            dirFile.mkdirs();
        }

        FileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);
        upload.setHeaderEncoding("UTF-8");
        List<?> items = null;
        try {
            items = upload.parseRequest(request);
        } catch (FileUploadException e1) {
            e1.printStackTrace();
        }
        Iterator<?> itr = items.iterator();
        while (itr.hasNext()) {
            FileItem item = (FileItem) itr.next();
            String fileName = item.getName();
            if (!item.isFormField()) {
                // 检查文件大小
                if (item.getSize() > maxSize) {
                    out.print("上传文件大小超过限制。");
                    return;
                }
                // 检查扩展名
                String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
                if (!Arrays.<String>asList(extMap.get(dirName).split(",")).contains(fileExt)) {
                    out.print("上传文件扩展名是不允许的扩展名。\n只允许" + extMap.get(dirName) + "格式。");
                    return;
                }

                SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
                String newFileName = df.format(new Date()) + "_" + new Random().nextInt(1000) + "." + fileExt;
                try {
                    File uploadedFile = new File(savePath, newFileName);
                    item.write(uploadedFile);
                    //Thumbnails.of(uploadedFile).size(400, 400).toFile(uploadedFile);
                } catch (Exception e) {
                    out.print("上传文件失败。");
                    return;
                }

                JSONObject obj = new JSONObject();
                obj.put("error", 0);
                obj.put("url", saveUrl + newFileName);
                out.print(obj.toJSONString());
            }
        }
    }

}
